import { Request, Response } from 'express'
import { AppError } from '../utils/AppError'
import { logger } from '../utils/logger'

// 错误类型枚举
enum ErrorType {
  VALIDATION_ERROR = 'VALIDATION_ERROR', // 验证错误
  DATABASE_ERROR = 'DATABASE_ERROR', // 数据库错误
  NETWORK_ERROR = 'NETWORK_ERROR', // 网络错误
  AUTH_ERROR = 'AUTH_ERROR', // 认证错误
  PAYMENT_ERROR = 'PAYMENT_ERROR', // 支付错误
  UNKNOWN_ERROR = 'UNKNOWN_ERROR', // 未知错误
}

// 友好的错误提示信息
const ERROR_MESSAGES = {
  [ErrorType.VALIDATION_ERROR]: '请求参数不合法，请检查后重试',
  [ErrorType.DATABASE_ERROR]: '数据库操作失败，请稍后重试',
  [ErrorType.NETWORK_ERROR]: '网络连接异常，请检查网络设置',
  [ErrorType.AUTH_ERROR]: '认证失败，请重新登录',
  [ErrorType.PAYMENT_ERROR]: '支付失败，请稍后重试',
  [ErrorType.UNKNOWN_ERROR]: '系统异常，请稍后重试',
}

export const errorHandler = (error: Error | AppError, req: Request, res: Response) => {
  // 记录错误日志
  logger.error({
    message: error.message,
    stack: error.stack,
    url: req.originalUrl,
    method: req.method,
    ip: req.ip,
    userAgent: req.headers['user-agent'],
  })

  // 处理已知错误
  if (error instanceof AppError) {
    return res.status(error.statusCode).json({
      status: 'error',
      type: error.type || ErrorType.UNKNOWN_ERROR,
      message: ERROR_MESSAGES[error.type] || error.message,
      code: error.code,
    })
  }

  // 处理特定错误类型
  if (error.name === 'ValidationError') {
    return res.status(400).json({
      status: 'error',
      type: ErrorType.VALIDATION_ERROR,
      message: ERROR_MESSAGES[ErrorType.VALIDATION_ERROR],
      details: error.message,
    })
  }

  if (error.name === 'MongoError') {
    return res.status(500).json({
      status: 'error',
      type: ErrorType.DATABASE_ERROR,
      message: ERROR_MESSAGES[ErrorType.DATABASE_ERROR],
    })
  }

  // 处理未知错误
  return res.status(500).json({
    status: 'error',
    type: ErrorType.UNKNOWN_ERROR,
    message: ERROR_MESSAGES[ErrorType.UNKNOWN_ERROR],
  })
}
